#include <iostream> // 包含 cerr 的头文件
#include <new>      // 包含 operator new 和 set_new_handler 的头文件

template <class T>
inline T *_allocate(ptrdiff_t num, T * /*unused = nullptr*/) {
  // 通常不需要在这里设置 new_handler，除非你有特殊的理由
  std::set_new_handler(0); // 注释掉或删除这一行

  // 注意这里使用 num 而不是 size，因为 num 通常是对象的数量
  // size 应该是单个对象的大小（由 sizeof(T) 提供）
  T *tmp = (T *)(::operator new((std::size_t)(num * sizeof(T))));
  if (tmp == nullptr) {
    std::cerr << "out of memory" << std::endl;
    std::exit(1); // 使用 std::exit 而不是 exit，以确保正确的析构函数调用
  }
  return tmp;
}

// 使用示例
int main() {
  int *int_array = _allocate<int>(10, nullptr); // 分配10个int的空间
  // ... 使用 int_array ...

  // 释放内存
  delete[] int_array; // 注意这里使用 delete[]，因为我们分配的是一个数组

  return 0;
}